Su vysledky tychto SQL prikazov rovnake ?

Otázka od: Roland Turcan

20. 9. 2002 14:50

Hello Delphi CZ konferencia!

1.

SELECT * FROM POKLADNA
WHERE JEDIN IN (SELECT RECORD_ID FROM SYS$REP
                            WHERE TABULKA='POKLADNA' AND
                                  ZMENA<>'D' AND
                                  JEDIN>40000
);


2.

select *
from pokladna a
join sys$rep b on b.record_id=a.jedin
and b.tabulka='POKLADNA' and b.ZMENA<>'D'
and b.JEDIN>40000;


Co vy na to ?

--
Best regards, TRoland
http://www.rotursoft.sk

Odpovedá: Roland Turcan

21. 9. 2002 10:21

<<< 21. 9. 2002 10:07 - Ondrej Kelle "O.Kelle@digitalpublishing.de" >>>
>> 1.
>>
>> SELECT * FROM POKLADNA
>> WHERE JEDIN IN (SELECT RECORD_ID FROM SYS$REP
>> WHERE TABULKA='POKLADNA' AND
>> ZMENA<>'D' AND
>> JEDIN>40000
>> );
>>
>>
>> 2.
>>
>> select *
>> from pokladna a
>> join sys$rep b on b.record_id=a.jedin
>> and b.tabulka='POKLADNA' and b.ZMENA<>'D'
>> and b.JEDIN>40000;

OK> Urcite to nebudu rovnake vysledky, pretoze 1. * vracia vsetky stlpce z
OK> tabulky POKLADNA, a 2. * vracia vsetky stlpce z celeho joinu.

OK> Okrem toho, (ak som to pochopil spravne) 1. vrati result set, v ktorom bude
OK> pre kazdu hodnotu POKLADNA.JEDIN (ak splna dane kriteria) prave jeden
OK> riadok.
OK> 2. (left inner join) vrati result set, kde pre kazdu hodnotu POKLADNA.JEDIN
OK> moze byt jeden alebo viac riadkov splnajucich dane kriteria.

Ano, ano celu noc som programoval vo sne a prisnilo sa mi  

ze toto je moje riesenie:

SELECT DISTINCT A.*
FROM KURZ_LIST A
JOIN SYS$REP B ON A.JEDIN=B.RECORD_ID AND B.TABULKA='KURZ_LIST' AND
B.ZMENA<>'D' AND B.JEDIN>5000

oproti tomu prvemu to kleslo z 8.5s na 200ms. To je uz papanek
rozdiel. Mal som stale ten pocit, ze to druhe riesenie nie je to prave
orechove a fakt moja intuicia sa zase potvrdila. Aj napriek tomu
dakujem.

--
Best regards, TRoland
http://www.rotursoft.sk

Odpovedá: Lebeda David

20. 9. 2002 15:55

>
> SELECT * FROM POKLADNA
> WHERE JEDIN IN (SELECT RECORD_ID FROM SYS$REP
> WHERE TABULKA='POKLADNA' AND
> ZMENA<>'D' AND
> JEDIN>40000
> );
>
>
> 2.
>
> select *
> from pokladna a
> join sys$rep b on b.record_id=a.jedin
> and b.tabulka='POKLADNA' and b.ZMENA<>'D'
> and b.JEDIN>40000;
>
>
> Co vy na to ?

Ahoj,

Zalezi na tom. Pokud muze nastat situace, ze subselect vrati vice zaznamu se
stejnym RECORD_ID, vrati join vice radku nez priklad se subselectem.

Aspon se mi to tak zda na prvni letmy pohled.

David Lebeda

Odpovedá: Ondrej Kelle

20. 9. 2002 16:37

> 1.
>
> SELECT * FROM POKLADNA
> WHERE JEDIN IN (SELECT RECORD_ID FROM SYS$REP
> WHERE TABULKA='POKLADNA' AND
> ZMENA<>'D' AND
> JEDIN>40000
> );
>
>
> 2.
>
> select *
> from pokladna a
> join sys$rep b on b.record_id=a.jedin
> and b.tabulka='POKLADNA' and b.ZMENA<>'D'
> and b.JEDIN>40000;

Urcite to nebudu rovnake vysledky, pretoze 1. * vracia vsetky stlpce z
tabulky POKLADNA, a 2. * vracia vsetky stlpce z celeho joinu.

Okrem toho, (ak som to pochopil spravne) 1. vrati result set, v ktorom bude
pre kazdu hodnotu POKLADNA.JEDIN (ak splna dane kriteria) prave jeden
riadok.
2. (left inner join) vrati result set, kde pre kazdu hodnotu POKLADNA.JEDIN
moze byt jeden alebo viac riadkov splnajucich dane kriteria.

HTH
TOndrej